We returned the innermost child that has the pointer, which is not right.
Only the direct child that has the pointer in it should be reported (if any).
if (window)
{
double xx, yy;
-
+
window = _gdk_window_find_descendant_at (window,
- x, y,
+ x, y,
&xx, &yy);
x = floor (xx + 0.5);
y = floor (yy + 0.5);
}
-
+
*win_x = x;
*win_y = y;
-
+
return window;
}
private = (GdkWindowObject *) window;
- pointer_window = _gdk_windowing_window_get_pointer (display,
- window,
- &tmpx, &tmpy,
- mask);
+ _gdk_windowing_window_get_pointer (display,
+ window,
+ &tmpx, &tmpy,
+ mask);
/* We got the coords on the impl, conver to the window */
tmpx -= private->abs_x;
tmpy -= private->abs_y;
-
+
if (x)
*x = tmpx;
if (y)
*y = tmpy;
- /* We need to recalculate the true child window with the pointer in it
- due to possible client side child windows */
- if (pointer_window != NULL)
- {
- /* First get the pointer coords relative to pointer_window */
- _gdk_windowing_window_get_pointer (display,
- pointer_window,
- &tmpx, &tmpy,
- &tmp_mask);
- /* Then convert that to a client side window */
- pointer_window = _gdk_window_find_descendant_at (pointer_window,
- tmpx, tmpy,
- NULL, NULL);
- }
-
- return pointer_window;
+ return _gdk_window_find_child_at (window, x, y);
}
/**
cairo_surface_t * _gdk_windowing_create_cairo_surface (GdkDrawable *drawable,
int width,
int height);
+GdkWindow * _gdk_window_find_child_at (GdkWindow *window,
+ int x, int y);
GdkWindow * _gdk_window_find_descendant_at (GdkWindow *toplevel,
double x, double y,
double *found_x,
*window_y = y;
}
+GdkWindow *
+_gdk_window_find_child_at (GdkWindow *window,
+ int x, int y)
+{
+ GdkWindowObject *private, *sub;
+ double child_x, child_y;
+ GList *l;
+
+ private = (GdkWindowObject *)window;
+
+ if (point_in_window (private, x, y))
+ {
+ /* Children is ordered in reverse stack order, i.e. first is topmost */
+ for (l = private->children; l != NULL; l = l->next)
+ {
+ sub = l->data;
+
+ if (!GDK_WINDOW_IS_MAPPED (sub))
+ continue;
+
+ convert_coords_to_child (sub,
+ x, y,
+ &child_x, &child_y);
+ if (point_in_window (sub, child_x, child_y))
+ return (GdkWindow *)sub;
+ }
+ }
+
+ return NULL;
+}
+
+
GdkWindow *
_gdk_window_find_descendant_at (GdkWindow *toplevel,
double x, double y,